home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / hardware / blizkick / modules / chipsaver.asm < prev    next >
Assembly Source File  |  1999-05-17  |  6KB  |  264 lines

  1. ; FILE: Source:modules/ChipSaver.ASM          REV: 51 --- Copies chipmem to fast
  2.  
  3. ;
  4. ; ChipSaver patch for BlizKick
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ; This module copies chip memory to fast memory if  if RMB is pressed during
  7. ; reboot. Creates ExoticRipper compatible image ($100 -image).
  8. ;
  9. ; Suggested by Max Romanoff.
  10. ;
  11. ; Written by Harry Sintonen.
  12. ; This source code is Public Domain.
  13. ;
  14.  
  15. ;FASTBUFHEAD_LEN EQU    256*1024        ;skip first 256K (prevent trashing)
  16. CHIPBEGSAVE_LEN    EQU    64*1024            ;save lenght (must be multiple of 64)
  17.  
  18.     incdir    "include:"
  19.     include    "exec/types.i"
  20.     include    "exec/libraries.i"
  21.     include    "exec/memory.i"
  22.  
  23.     include    "exec/execbase.i"
  24.  
  25.     include    "blizkickmodule.i"    ; Some required...
  26.  
  27.     SECTION    PATCH,CODE
  28. _DUMMY_LABEL
  29.     BK_PTC
  30.  
  31. ; Code is run with following incoming parameters:
  32. ;
  33. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  34. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  35. ; d0=ROM lenght in bytes    eg. $00080000
  36. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  37. ;    CALL: jsr (a2)
  38. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  39. ;     OUT: d0=ptr to resident (buf) or NULL
  40. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  41. ;    CALL: jsr (a3)
  42. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  43. ;     OUT: d0=success
  44. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  45. ;    CALL: jsr (a4)
  46. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  47. ;     OUT: -
  48. ; d6=dosbase, a6=execbase
  49. ;
  50. ; Code should return:
  51. ;
  52. ; d0=true if succeeded, false if failed.
  53. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  54.  
  55.     cmp.w    #37,($C,a0)        ;requires V37+ rom image
  56.     bhs.b    .cont
  57.     moveq    #0,d0
  58.     rts
  59.  
  60. .cont    moveq    #0,d7
  61.  
  62.     move.l    d0,-(sp)
  63.     bsr    FindBlizMemMid
  64.     move.l    d0,d1
  65.     move.l    (sp)+,d0
  66.     tst.l    d1
  67.     beq.b    .noblizmem
  68. ;    add.l    #FASTBUFHEAD_LEN,d1
  69.     lea    (_absdstp_1,pc),a5    ;fix chipbegsave buffer adr
  70.     move.l    d1,(a5)
  71.     lea    (_absdstp_2,pc),a5
  72.     move.l    d1,(a5)
  73.  
  74.     move.l    a0,a5
  75.     move.l    #$13FC0003,d1
  76.     move.w    #512-1,d2
  77. .findl    subq.w    #1,d2
  78.     beq.b    .badrom
  79.     addq.l    #2,a5
  80.     cmp.l    (a5),d1
  81.     bne.b    .findl
  82.  
  83.     move.l    a5,d1            ;d1=jump pos (buf)
  84.     moveq    #8,d3
  85.     add.l    d1,d3
  86.     sub.l    a0,d3
  87.     add.l    a1,d3            ;d3=return jump pos (rom)
  88.  
  89.     move.l    a0,-(sp)
  90.     move.l    d1,a0            ;copy original code
  91.     lea    (_instpos,pc),a5
  92.     move.l    (a0)+,(a5)+
  93.     move.l    (a0)+,(a5)+
  94.  
  95.     lea    (_jmpromp,pc),a0    ;fix returning jmp
  96.     move.l    d3,(a0)
  97.  
  98.     move.l    d1,a5            ;create jmp
  99.     move.w    #$4EF9,(a5)+
  100.     move.l    #_earlycode_RT,(a5)    ;add RT!!
  101.     move.l    (sp)+,a0
  102.  
  103.     move.l    d0,d5
  104.     lea    (_copier_module,pc),a1
  105.     jsr    (a3)            ;call _InstallModule
  106.     move.l    d0,d1
  107.     move.l    d5,d0
  108.     tst.l    d1
  109.     beq.b    .nomod
  110.  
  111.     lea    (_name,pc),a1
  112.     jsr    (a2)            ;call _FindResident
  113.     tst.l    d0
  114.     beq.b    .nomod
  115.     add.l    d0,(a5)            ;add RT!
  116.  
  117.     moveq    #1,d7
  118. .nomod
  119. .badrom
  120. .noblizmem    move.l    d7,d0
  121.     rts
  122.  
  123.  
  124. FindBlizMemMid    movem.l    d1-a6,-(sp)
  125.     moveq    #0,d1
  126.     jsr    (-$84,a6)        ;Forbid
  127.     lea    (MemList,a6),a5
  128.     lea    (4,a5),a4
  129. .scanloop    move.l    (a5),a5
  130.     cmp.l    a5,a4
  131.     beq.b    .notfound
  132.     move.w    (MH_ATTRIBUTES,a5),d0
  133.     and.w    #MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC,d0    ;Public fast?
  134.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  135.     bne.b    .scanloop
  136.     cmp.l    #$01000000,(MH_LOWER,a5)    ;32bit?
  137.     blo.b    .scanloop
  138.     move.l    (LN_NAME,a5),d0
  139.     beq.b    .found
  140.     move.l    d0,a2
  141.     move.l    (a2),d0
  142.     or.l    #$20202020,d0        ;To lowercase
  143.     cmp.l    #'bliz',d0
  144.     beq.b    .found
  145.     tst.b    (a2)            ;null name -> buggy AllocMem result test!
  146.     bne.b    .scanloop
  147. .found    move.l    (MH_LOWER,a5),d1
  148. .notfound    jsr    (-$8A,a6)        ;Permit
  149.     move.l    d1,d0            ;must set d0!!
  150.     beq.b    .exit
  151.  
  152.     move.l    (MH_UPPER,a5),d0
  153.     sub.l    d1,d0
  154.     lsr.l    #2,d0            ;add ¼th
  155.     add.l    d1,d0
  156.     and.w    #$FFF0,d0
  157.  
  158. .exit    movem.l    (sp)+,d1-a6
  159.     rts
  160.  
  161.     CNOP    0,4
  162. _copier_module
  163.  BK_MOD BKMF_SingleMode,_end,(RTF_COLDSTART)<<24+37<<16+NT_UNKNOWN<<8+104,_name,_idstr,_init
  164.  
  165. ; Singlemode on,
  166. ; COLDSTART module, requires KS V37.x or better, module type NT_UNKNOWN, priority 104.
  167. ; At priority 104 fastmem should be available.
  168.  
  169. _init    btst    #6,$BFE001        ;test LMB
  170.     beq    .sexit            ;if pressed don't copy
  171.     movem.l    d0-a6,-(sp)
  172.  
  173.     lea    $DFF000,a5
  174.     move.w    #$FFFF,($34,a5)        ;pin 9 to write mode! ($0C00)
  175.  
  176.     moveq    #1-1,d0            ; Wait for two vertical blankings
  177. .wait1    btst    #0,($5,a5)        ; (Could wait only 300 µs!)
  178.     bne.b    .wait1
  179. .wait2    btst    #0,($5,a5)
  180.     beq.b    .wait2
  181.     dbf    d0,.wait1
  182.  
  183.     btst    #10-8,($16,a5)        ;test RMB
  184.     bne    .exit            ;if not pressed don't copy
  185.  
  186.     move.l    (4).w,a6
  187.     move.l    (MaxLocMem,a6),d2
  188.  
  189.     move.l    d2,d0
  190.     move.l    #MEMF_FAST!MEMF_PUBLIC!MEMF_REVERSE,d1    ; buggy on pre-39
  191.     jsr    (-$C6,a6)        ;AllocMem
  192.     tst.l    d0
  193.     beq.b    .exit
  194.     move.l    d0,a2
  195.  
  196.     move.l    a2,a1
  197.  
  198.     lea    $0BAD0000,a0
  199. _absdstp_1    EQU    *-4
  200.     move.w    #CHIPBEGSAVE_LEN/8-1,d0
  201. .cscopy    move.l    (a0)+,(a1)+
  202.     move.l    (a0)+,(a1)+
  203.     dbf    d0,.cscopy
  204.  
  205.     lea    CHIPBEGSAVE_LEN,a0
  206.     move.l    d2,d0
  207.     sub.l    a0,d0
  208.  
  209.     lsr.l    #6,d0            ;/64
  210.     subq.l    #1,d0
  211.     move.l    d2,d7
  212.     moveq    #4*4,d6
  213. .copy    move.w    d0,($180,a5)
  214.     movem.l    (a0)+,d1-d4        ;16
  215.     movem.l    d1-d4,(a1)
  216.     add.l    d6,a1
  217.     movem.l    (a0)+,d1-d4        ;16
  218.     movem.l    d1-d4,(a1)
  219.     add.l    d6,a1
  220.     movem.l    (a0)+,d1-d4        ;16
  221.     movem.l    d1-d4,(a1)
  222.     add.l    d6,a1
  223.     movem.l    (a0)+,d1-d4        ;16
  224.     movem.l    d1-d4,(a1)
  225.     add.l    d6,a1
  226.     dbf    d0,.copy
  227.     move.l    d7,d2
  228.  
  229.     move.l    a2,$100.w
  230.     move.l    #$DEADBEEF,(a2)+
  231.     move.l    d2,(a2)+
  232.     clr.l    (a2)
  233.  
  234.     move.w    #0,($180,a5)
  235.  
  236. .exit    movem.l    (sp)+,d0-a6
  237. .sexit    rts
  238.  
  239. _earlycode_RT    EQU    *-_copier_module-bkm_ResTag
  240.     sub.l    a0,a0
  241.     lea    $0BAD0000,a1
  242. _absdstp_2    EQU    *-4
  243.     move.w    #CHIPBEGSAVE_LEN/8-1,d0
  244. .ecopy    move.l    (a0)+,(a1)+
  245.     move.l    (a0)+,(a1)+
  246.     dbf    d0,.ecopy
  247. _instpos    nop
  248.     nop
  249.     nop
  250.     nop
  251.     jmp    $0BAD0000        ;jmppos+10
  252. _jmpromp    EQU    *-4
  253.  
  254. _name
  255. _idstr    dc.b    'ChipSaver',0
  256.     CNOP    0,2
  257. _end
  258.  
  259.     SECTION    VERSION,DATA
  260.  
  261.     dc.b    '$VER: ChipSaver_PATCH 1.0 (21.5.97)',0
  262.  
  263.     END
  264.